import os
import subprocess

def merge_video_audio(input_folder, output_folder):
    # 确保输出文件夹存在
    os.makedirs(output_folder, exist_ok=True)

    # 支持的视频和音频扩展名
    video_extensions = ['.mp4', '.mkv', '.mov', '.avi', '.flv', '.webm']
    audio_extensions = ['.mp3', '.weba', '.mpa']

    video_path = None
    audio_path = None

    # 遍历输入文件夹
    for filename in os.listdir(input_folder):
        filepath = os.path.join(input_folder, filename)

        # 跳过子目录
        if os.path.isdir(filepath):
            continue

        # 分离文件名和扩展名
        name, ext = os.path.splitext(filename)
        ext = ext.lower()

        # 检查是否是视频文件
        if ext in video_extensions:
            video_path = filepath
        # 检查是否是音频文件
        elif ext in audio_extensions:
            audio_path = filepath

    if video_path and audio_path:
        output_name = os.path.splitext(os.path.basename(video_path))[0]
        output_path = os.path.join(output_folder, f"merged_{output_name}.mp4")

        # 使用FFmpeg合并视频和音频
        cmd = [
            'ffmpeg',
            '-i', video_path,  # 输入视频文件
            '-i', audio_path,  # 输入音频文件
            '-c:v', 'copy',  # 直接复制视频流
            '-c:a', 'aac',  # 重新编码音频为AAC
            '-strict', 'experimental',
            '-map', '0:v:0',  # 选择第一个输入的视频流
            '-map', '1:a:0',  # 选择第二个输入的音频流
            '-shortest',  # 以较短的输入流结束
            '-y',  # 覆盖输出文件而不询问
            output_path
        ]

        print(f"正在合并: {os.path.basename(video_path)} 和 {os.path.basename(audio_path)}")
        try:
            subprocess.run(cmd, check=True)
            print(f"成功合并到: {output_path}")
        except subprocess.CalledProcessError as e:
            print(f"合并失败: {e}")
    else:
        print("未找到视频文件或音频文件，请检查输入文件夹。")

def main():
    # 设置命令行参数解析
    input_folder = input("请输入视频和音频所在的文件夹路径: ")
    # 固定输出文件夹为当前目录下的output文件夹
    output_folder = r'C:\Users\admin\Desktop\video'

    print(f"输入文件夹: {input_folder}")
    print(f"输出文件夹: {output_folder}")

    # 调用合并函数
    merge_video_audio(input_folder, output_folder)

if __name__ == "__main__":
    main()